fajlovi prikačeni uz rok.U arhivi se nalaze: XML schema (.xsd), XML dokument (.xml), XQuery upit ili XPath putanja (.xq), SQl dump baze (.sql), visio 2003 dijagram (.vsd) ukoliko postoje takvi fajlovi vezani za zadatke.
XML: za sve fajlove je
provereno da li su dobro oformljeni, a ako postoji i xml fajl i schema,
xml fajl je validiran u odnosu na odgovarajuću šemu. Za kreiranje
fajlova, proveru forme, validaciju, XPath i XQuery izraze korišćen je
XML editor EditX http://www.editix.com/
SQL: baza je
napravljena u MySQL-u pa prema tome SQL kod može imati netipičnu
sintaksu ili funkcije različite od onih u knjizi. Upiti su provereni,
prema mom shvatanju zadataka, koji često nisu baš lako shvatljivi.
Najlakše je preko MySQLyog-a uraditi "restore from SQL dump" da bi
mogli da probate upite nad podacima. Alati: MySQL http://www.mysql.com, MySQOyog www.webyog.com
UčesnikTrke (ŠifraTrke, OlimpijskiBroj, NazivTrke, RBStaze, ImePrezimeTrkača, ŠifraDržave, NazivDržave)
ŠifraTrke, OlimpijskiBroj --> RBStaze, ŠifraDržave, NazivDržave, NazivTrke, ImePrezimeTrkača
ŠifraTrke --> NazivTrke
OlimpijskiBroj --> ImePrezimeTrkača, ŠifraDržave, NazivDržave
ŠifraDržave --> NazivDržave
Relacija je u Boyce-Codd normalnoj formi ako su sve determinante ujedno i kandidati za ključ.
Determinanta je atribut ili skup atributa od kojih neki drugi atribut ili skup atributa potpuno funkcionalno zavisi.
ŠifraTrke, OlimpijskiBroj --> RBStaze(D)(KK)
ŠifraTrke --> NazivTrke(D)
OlimpijskiBroj --> ImePrezimeTrkača, ŠifraDržave, NazivDržave(D)
ŠifraDržave --> NazivDržave(D)
Očigledno relacija nije u Boyce-Codd normalnoj formi, pa je potrebno relaciju dekomponovati, tako da se dobiju relacije u kojima su kandidati za ključ one relacije koje su determinante u polaznoj relaciji:
Trkač(OlimpijskiBroj,ŠifraDržave)
Država(ŠifraDržave, NazivDržave)
Trka(ŠifraTrke, NazivTrke)
MestoUTrci(ŠifraTrke, OlimpijskiBroj, RBStaze)
A (A1#, A2, B)
B (B1#, B2)
AB1 (B1#, A1#)
D (A1#, D1)
G (G1#, G2)
H (B1#, A1#, G1#, H1)
C (B1#, C1)
E (G1#, E1)
F (G1#, F1)
FF (G1#, G1#)
class B (extent Bs key B1#){
attribute string B1#;
attribute string B2;
relationship A BA1 inverse A :: AB1;
relationship set<A> BA2 inverse A :: AB2;
attribute set<C> Cs;
};
class C {
attribute string C1;
};
class D extends A{
attribute string D1;
relationship set<H> DH inverse H :: HD;
};
class G (extent Gs key G1#){
attribute string G1#;
attribute string G2;
relationship set<H> Gh inverse H :: HG;
};
class H {
attribute string H1;
relationship B HB inverse B :: BH;
relationship D HD inverse D :: DH;
relationship G HG inverse G :: GH;
};
Spoljno spajanje se koristi kako bi se u rezultat spajanja uključili i oni redovi koji ne zadovoljavaju uslov spajanja.
Za ilustraciju ćemo koristiti sledeće tabele:
| ŠifraOdeljenja | NazivOdeljenja |
|---|---|
| 1 | Uprava |
| 2 | Računski centar |
| 3 | Proizvodnja |
| ŠifraRadnika | ImePrezime | ŠifraOdeljenja |
|---|---|---|
| 1000 | Pera Perić | 1 |
| 1001 | Marko Marković | 1 |
| 1002 | Žika Žikić | 2 |
| 1003 | Laza Lazić | 2 |
| 1004 | Petar Petrović |
omogućuje uključivanje u rezultujuću tabelu svih redova sa leve strane JOIN klauzule tako što se praznim redom proširuje tabela sa desne strane
Odeljenje LEFT OUTER JOIN Radnik USING(ŠifraOdeljenja)
| ŠifraOdeljenja | NazivOdeljenja | ŠifraRadnika | ImePrezime | ŠifraOdeljenja |
|---|---|---|---|---|
| 1 | Uprava | 1000 | Pera Perić | 1 |
| 1 | Uprava | 1001 | Marko Marković | 1 |
| 2 | Računski centar | 1002 | Žika Žikić | 2 |
| 2 | Računski centar | 1003 | Laza Lazić | 2 |
| 3 | Proizvodnja |
omogućuje uključivanje u rezultujuću tabelu svih redova sa desne strane JOIN klauzule tako što se praznim redom proširuje tabela sa leve strane
Odelenje RIGHT OUTER JOIN Radnik USING(ŠifraOdeljenja)
| ŠifraOdeljenja | NazivOdeljenja | ŠifraRadnika | ImePrezime | ŠifraOdeljenja |
|---|---|---|---|---|
| 1 | Uprava | 1000 | Pera Perić | 1 |
| 1 | Uprava | 1001 | Marko Marković | 1 |
| 2 | Računski centar | 1002 | Žika Žikić | 2 |
| 2 | Računski centar | 1003 | Laza Lazić | 2 |
| 1004 | Petar Petrović |
omogućuje uključivanje u rezultat svih redova leve i desne tabele, a tamo gde uslov spajanja nije ispunjen odgovrajuća strana je popunjena praznim poljima
Odelenje FULL OUTER JOIN Radnik USING(ŠifraOdeljenja)
| ŠifraOdeljenja | NazivOdeljenja | ŠifraRadnika | ImePrezime | ŠifraOdeljenja |
|---|---|---|---|---|
| 1 | Uprava | 1000 | Pera Perić | 1 |
| 1 | Uprava | 1001 | Marko Marković | 1 |
| 2 | Računski centar | 1002 | Žika Žikić | 2 |
| 2 | Računski centar | 1003 | Laza Lazić | 2 |
| 3 | Proizvodnja | |||
| 1004 | Petar Petrović |
Složeni konstruisani tipovi u objektno-relacionom bp su tip vrsta i tip kolekcija.
je niz polja koja čine parovi (<naziv podatka>,<tip podatka>). U SQL:1999 je moguce definisati promenljive i parametre koji su tipa vrsta, odnosno definisati kolonu u tabeli koja će imati kompleksnu strukturu.
tip vrsta se specificira sledećom sintaksom:
ROW (ulica CHAR(30), broj INTEGER, grad CHAR(20))
na primer:
CREATE TABLE student (brind char(6),
prezime CHAR(15),
adresa ROW (ulica CHAR(30),
broj INTEGER,
grad CHAR(20)));
predstavlja grupu koja se sastoji od nula ili više elemenata istog tipa. Tip kolekcije je određen vrstom kolekcije i tipom elementa kolekcije. SQL:1999 definiše samo jednu vrstu kolekcije - niz, ostale u nekoj sledecoj generaciji.
formalna definicija niza:
<tip elementa niza> ARRAY [<maksimalna kardinalnost niza>]
na primer:
CREATE TABLE sekcija (naziv CHAR(15),
clan CHAR(20) ARRAY[20]);
Kod vremenskog obeležavanja transakcija, transakcije na početku izvršavanja dobiju redni broj, tako da se kasnije zna koja je transakcija starija. Konflikt nastaje kada transakcija hoće da čita neki slog koji je mladja transakcija vec ažurirala, ili hoće da ažurira slog koji je mladja transakcija vec ažurirala ili videla. Konflikti se razrešavaju ponovnim startovanjem starije transakcije.
postoje dva identifikatora koji se zadaju svakom objektu baze podataka:
RMAX - najveća identifikacija transakcije koja je pročitala objekat
UMAX - najveća identifikacija transakcije koja je ažurirala objekat
if(t>=UMAX){
operacija se prihvata;
RMAX = max(t, RMAX);
}else{
konflikt;
restart T;
}
if(t>=RMAX && t>=UMAX){
operacija se prihvata;
UMAX = t;
}else{
konflikt;
restart T;
}
<?xml version="1.0" encoding="utf-8"?> <xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd" targetNamespace="www.nemanjakovacevic.com/bazepodataka/okt2008" xmlns="www.nemanjakovacevic.com/bazepodataka/okt2008"> <xsd:element name="model"> <xsd:complexType> <xsd:sequence> <xsd:element name="Dobavljac" type="DobavljacTip" minOccurs="0" maxOccurs="unbounded"/> <xsd:element name="Narudzbenica" type="NarudzbenicaTip" minOccurs="0" maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:complexType name="DobavljacTip"> <xsd:attribute name="SifraDob" type="xsd:ID" use="required"/> <xsd:attribute name="NazivDob" type="xsd:string" /> <xsd:attribute name="AdresaDob" type="xsd:string"/> </xsd:complexType> <xsd:complexType name="NarudzbenicaTip"> <xsd:sequence> <xsd:element name="StavkaNar" maxOccurs="unbounded"> <xsd:complexType> <xsd:attribute name="RedniBroj" type="xsd:integer" use="required"/> <xsd:attribute name="Proizvod" type="xsd:string" /> <xsd:attribute name="Kolicina" type="xsd:integer"/> <xsd:attribute name="Vrednost" type="xsd:double"/> <xsd:attribute name="Valuta" type="xsd:string" default="din"/> </xsd:complexType> </xsd:element> </xsd:sequence> <xsd:attribute name="BrojNarDob" type="xsd:ID" use="required"/> <xsd:attribute name="SifraDob" type="xsd:IDREF" use="required"/> </xsd:complexType> </xsd:schema>
<?xml version="1.0" encoding="utf-8"?> <model xmlns="www.nemanjakovacevic.com/bazepodataka/okt2008" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.nemanjakovacevic.com/bazepodataka/okt2008 file:///D:/My%20FON/IV%20godina/I%20semestar/Baze%20podataka/BProkovi2008/okt2008/podA.xsd"> <Dobavljac SifraDob="D1" NazivDob="Logitech"/> <Dobavljac SifraDob="D2" NazivDob="Canon"/> <Dobavljac SifraDob="D3" NazivDob="XYZ"/> <Narudzbenica BrojNarDob="N11" SifraDob="D1"> <StavkaNar RedniBroj="1" Proizvod="Logitech MX Revolution" Kolicina="1" Vrednost="7800"/> <StavkaNar RedniBroj="2" Proizvod="Logitech Deluxe Keyboard" Kolicina="1" Vrednost="800"/> <StavkaNar RedniBroj="3" Proizvod="Logitech X 230" Kolicina="1" Vrednost="3500"/> <StavkaNar RedniBroj="4" Proizvod="A" Kolicina="1" Vrednost="3500"/> <StavkaNar RedniBroj="5" Proizvod="B" Kolicina="1" Vrednost="3500"/> </Narudzbenica> <Narudzbenica BrojNarDob="N21" SifraDob="D2"> <StavkaNar RedniBroj="1" Proizvod="Canon MP 180" Kolicina="1" Vrednost="8800"/> <StavkaNar RedniBroj="2" Proizvod="Canon MX 300" Kolicina="1" Vrednost="10000"/> </Narudzbenica> <Narudzbenica BrojNarDob="N31" SifraDob="D3"> <StavkaNar RedniBroj="1" Proizvod="A" Kolicina="1" Vrednost="3500"/> <StavkaNar RedniBroj="2" Proizvod="B" Kolicina="1" Vrednost="3500"/> </Narudzbenica> </model>
for
$x in doc("podB.xml")/model/Narudzbenica
where
$x/@SifraDob=/model/Dobavljac[@NazivDob="XYZ"]/@SifraDob
and
$x/StavkaNar[@Proizvod="A"]
and
$x/StavkaNar[@Proizvod="B"]
return
$x
select LokacijaID from Lokacija join PopisnaLista using(LokacijaID) join StavkaPopisneListe using(ListaID) where extract(year from DatumPopisa) = 2007 and TipLokacije = 'Proizvodni pogon' group by LokacijaID having sum(case when PopisanaKol = 0 then 1 else 0 end) > 0
select LokacijaID, Lokacija.Naziv, AmortizacionaGrupa, min(NabavnaVrednost) from Lokacija join PopisnaLista using(LokacijaID) join StavkaPopisneListe using(ListaID) join OsnovnoSredstvo using(InventarniBroj) group by LokacijaID, Naziv, AmortizacionaGrupa order by LokacijaID desc
select distinct Naziv from OsnovnoSredstvo join StavkaPopisneListe using(InventarniBroj) join PopisnaLista using(ListaID) where extract(year from DatumPopisa) = 2008 and AmortizacionaGrupa = 'Kompjuterska oprema' and Naziv not in (select distinct Naziv from OsnovnoSredstvo join StavkaPopisneListe using(InventarniBroj) join PopisnaLista using(ListaID) where extract(year from DatumPopisa) = 2007 and AmortizacionaGrupa = 'Kompjuterska oprema')